/**
 * Date 日期格式化
 *
 * @param format 进行格式化的模式字符串
 *     支持的模式字母有：
 *     y:年,
 *     M:年中的月份(1-12),
 *     d:月份中的天(1-31),
 *     h:小时(0-23),
 *     m:分(0-59),
 *     s:秒(0-59),
 *     S:毫秒(0-999),
 *     q:季度(1-4)
 * @return String
 */
Date.prototype.format = function(format) {
    var date = this;
    format = format || 'yyyy-MM-dd';

    var map = {
        "M": date.getMonth() + 1, //月份
        "d": date.getDate(), //日
        "h": date.getHours(), //小时
        "m": date.getMinutes(), //分
        "s": date.getSeconds(), //秒
        "q": Math.floor((date.getMonth() + 3) / 3), //季度
        "S": date.getMilliseconds() //毫秒
    };

    format = format.replace(/([yMdhmsqS])+/g, function (all, t) {
        var v = map[t];
        if (v !== undefined) {
            if (all.length > 1) {
                v = '0' + v;
                v = v.substr(v.length - 2);
            }
            return v;
        } else if (t === 'y') {
            return (date.getFullYear() + '').substr(4 - all.length);
        }
        return all;
    });
    return format;
}

/**
 * 日期字符串格式化

 * @param  {String} datestr [日期字符串]
 * @param  {String} format  [格式化模式]
 * @return {Date}           [Date日期]
 */
function dateFormat(datestr, format) {
    //- Safari不兼容Javascript中的Date()问题
    datestr = datestr.replace(/-/g, '/');
    return new Date(datestr).format(format);
}

/**
 * 获取当天日期或几天后的日期
 *
 * @param  addDayCount  添加的天数
 * @return String       日期 [年-月-日]
 */
function getDate(addDayCount) {
    addDayCount = addDayCount || 0;
    var now = new Date();
    if (addDayCount > 0) {
        // 获取AddDayCount后的日期
        now.setDate(now.getDate() + addDayCount);
    }
    return now.format();
}


/**
 * 指定时间是否小于当前时间
 *
 * @param  date     指定时间
 * @return Boolean
 */
function beforeNow(date) {
    //- Safari不兼容Javascript中的Date()问题
    date = date.replace(/-/g, '/');
    // date = date.split('-').join('/');
    return +new Date() > +new Date(date);
}

/**
 * 指定时间是否大于当前时间
 *
 * @param  date     指定时间
 * @return Boolean
 */
function afterNow(date) {
    return +new Date() < +new Date(date.replace(/-/g, '/'));
}

/**
 * 获取时间戳
 *
 * @param  date    时间
 * @return String  时间戳
 */
function getTimestamp(date) {
    return Math.round((date ? +new Date(date.replace(/-/g, '/')) : +new Date()) / 1000);
}

/**
 * @desc   格式化${startTime}距现在的已过时间
 * @param  {Date|String} startTime
 * @return {String}
 */
function formatPassTime(startTime) {
    if (startTime instanceof Date) {
        startTime = +startTime;
    }
    if (new String(startTime) instanceof String) {
        startTime = +new Date(startTime);
    }
    var currentTime = +new Date(),
        time = currentTime - startTime,
        day = parseInt(time / (1000 * 60 * 60 * 24 )),
        hour = parseInt(time / (1000 * 60 * 60 )),
        min = parseInt(time / (1000 * 60 )),
        month = parseInt(day / 30 ),
        year = parseInt(month / 12 );
    if (year) return year + "年前"
    if (month) return month + "个月前"
    if (day) return day + "天前"
    if (hour) return hour + "小时前"
    if (min) return min + "分钟前"
    else return '刚刚'
}

/**
 * 格式化现在距${endTime}的剩余时间
 * @param  {Date} endTime
 * @return {String}
 */
function formatRemainTime(endTime) {
    var startDate = new Date ();        //- 开始时间
    var endDate = new Date (endTime);   //- 结束时间
    var t = endDate.getTime() - startDate.getTime(); //时间差
    var d = 0, h = 0, m = 0, s = 0;
    if (t >= 0 ) {
        d = Math .floor(t / 1000 / 3600 / 24 );
        h = Math .floor(t / 1000 / 60 / 60 % 24 );
        m = Math .floor(t / 1000 / 60 % 60 );
        s = Math .floor(t / 1000 % 60 );
    }
    return d + "天" + h + "小时" + m + "分钟" + s + "秒";
}